package io.gitee.hchaojie.day08.thread.exam;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class Factory {
    private static final int MAX = 5;
    
    private List<Integer> products = new ArrayList<>();

    private int id = 0;

    private ReentrantLock lock = new ReentrantLock();
    private Condition notFull = lock.newCondition();
    private Condition notEmpty = lock.newCondition();


    public void produce() {
        lock.lock();
        try {
            if (products.size() >= 5) {
                try {
                    // 我（生产者）就在这里等着，工厂可以继续生产了叫我一声
                    notFull.await();
                    // wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            System.out.println("生产了一个商品：" + id);
            products.add(id++);

            notEmpty.signal();            // 有新产品了，你们（消费者）可以继续买了
        } finally {
            lock.unlock();
        }

//        if (products.size() <= 5) {
//            System.out.println("生产了一个商品：" + id);
//            products.add(id++);
//        } else {
//            System.out.println("工厂满了，你回去吧。。。");
//        }
    }

    public void consume() {
        lock.lock();
        try {
            if (products.isEmpty()) {
                try {
                    System.out.println("我就在这里等，有新东西了，叫我一声。。。" + Thread.currentThread().getName());
                    // wait();     // 会释放线程持有的锁（Factory对象）

                    notEmpty.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            try {
                Integer i = products.remove(0);
                System.out.println("消费了一个商品：" + i + " " + Thread.currentThread().getName());
            } catch (Exception e) {
                System.out.println(e);
                System.out.println(products.size());
                System.out.println("Thread: " + Thread.currentThread().getName());
            }

            notFull.signal();    // 我拿走了一个产品，现在可以继续生产了。。
        } finally {
            lock.unlock();
        }
        // 唤醒其它进入wait状态的线程（在当前Factory对象上）

//        if (!products.isEmpty()) {
//            Integer i = products.remove(0);
//            // System.out.println("消费了一个商品：" + i);
//        } else {
//            // System.out.println("没有东西了，回去吧。。。");
//        }
    }
}
